﻿using System;
using System.Collections.Generic;
using System.Linq;
using Xomega.Framework;
using Xomega.Framework.Properties;
using Xomega.Framework.Lookup;
using System.ServiceModel;
using AdventureWorks.Services;
using System.Collections;

namespace AdventureWorks.Client.Objects
{
    public class StateProperty : EnumIntProperty
    {
        public const string EnumTypeStates = "states";
        public const string AttributeCountry = "country";
        public const string AttributeAbbrev = "abbrev";

        public StateProperty(DataObject parent, string name)
            : base(parent, name)
        {
            EnumType = EnumTypeStates;
        }

        protected override LookupTable GetLookupTable()
        {
            LookupTable res = base.GetLookupTable();
            if (res == null)
            {
                List<Header> data = new List<Header>();
                foreach (State st in GetStates())
                {
                    Header h = new Header(EnumType, "" + st.StateProvinceId, st.Name);
                    h[AttributeCountry] = st.CountryRegionCode;
                    h[AttributeAbbrev] = st.StateProvinceCode;
                    data.Add(h);
                }
                res = new LookupTable(EnumType, data, true);
                LookupCache cache = LookupCache.Get(CacheType);
                if (cache != null) cache.CacheLookupTable(res);
            }
            return res;
        }

        protected virtual IEnumerable<State> GetStates()
        {
            ChannelFactory<IStateProvinceService> factory = new ChannelFactory<IStateProvinceService>(typeof(IStateProvinceService).Name);
            IStateProvinceService svc = factory.CreateChannel();
            List<State> output = svc.ReadList();
            factory.Close();

            return output;
        }
    }

    public class EmployeeStateProperty : StateProperty
    {
        public const string EnumTypeEmpStates = "employee states";

        public EmployeeStateProperty(DataObject parent, string name)
            : base(parent, name)
        {
            EnumType = EnumTypeEmpStates;
        }

        protected override IEnumerable<State> GetStates()
        {
            ChannelFactory<IEmployeeService> factory = new ChannelFactory<IEmployeeService>(typeof(IEmployeeService).Name);
            IEmployeeService svc = factory.CreateChannel();
            List<State> output = svc.GetStates();
            factory.Close();

            return output;
        }
    }
}
